/*
 * Kelas car (mobil)
 */
package Car;

import Point.Point;
/**
 * Kelas car (mobil)
 * @author SAM
 */
public class Car {
    private Point posisi;
    // kecepatan (satuan posisi /milidetik)
    private double V;
    
    /**
     * Konstruktor dari kelas Car
     */
    public Car(){
        posisi = new Point();
        V = 0;
    }
    
    /**
     * Konstruktor dari kelas Car 
     * @param _p Posisi Car
     * @param _Vs Kecepatan Car (satuan posisi / detik)
     */
    public Car(Point _p, double _Vs){
        posisi = _p;
        V = _Vs/1000;        
    }
    
    /**
     * Konstruktor dari kelas Car 
     * @param _Vs Kecepatan Car (satuan posisi / detik)
     */
    public Car(double _Vs){
        posisi = new Point();
        V = _Vs/1000;        
    }
    
    /**
     * Setter Posisi
     * @param _p Posisi
     */
    public void SetPos(Point _p){
        posisi = _p;
    }
    
    /**
     * Setter Kecepatan
     * @param _Vs Kecepatan Car (satuan posisi / detik)
     */   
    public void SetVel(double _Vs){
        V = _Vs/1000;     
    }
    
    /**
     * Getter Posisi
     * @return Posisi Car saat ini
     */
    public Point getPos(){
        return posisi;
    }
     
    /**
     * Getter Kecepatan
     * @return Posisi Car saat ini
     */
    public double getVel(){
        return Math.floor(V*1000);
    }
    /**
     * Update posisi dalam dt milisekon
     * @param dt 
     */
    public void Update(double dt){
        double _dy = V * dt;
        posisi.AddOrdinat(_dy);
    }
    
    /**
     * Mengembalikan car dalam format Pos: (x,y) v: V
     * @return Point String
     */
    public String toString(){
        return "Pos: "+posisi+" v: "+V;
    }
    
    /**
     * Mengecek apakah sebuah object bernilai sama dengan object sekarang 
     * Override dari Object.equals
     * @param obj
     * @return boolean, hasil perbandingan
     */
    
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        } else if (obj == null) {
            return false;
        } else if (obj.getClass() != getClass()) {
            return false;
        }
        
        final Car dummy = (Car) obj;
        if (!posisi.equals(dummy.posisi)) return false;
        if (dummy.V != V) return false;
        return true;
    }
    
    /**
     * Mengembalikan hasil hashing dari Object
     * @return integer (angka hash)
     */
    public int hashCode() {
        int hash = 5;
        hash = 41 * hash + (this.posisi != null ? this.posisi.hashCode() : 0);
        hash = 41 * hash + (int) (Double.doubleToLongBits(this.V) ^ (Double.doubleToLongBits(this.V) >>> 32));
        return hash;
    }
}
